1. Field of the Invention
This invention relates to Java programming, and particularly to automated injection of Java bytecode instructions for Java load time optimization via runtime checking with upcasts.
2. Description of Background
Java virtual machine performs verification of all loaded classes, except those from the bootclasspath. Verification requires every exception being thrown and caught be checked to be a subclass of java.lang.Throwable. It also requires checking of all non-trivial referenced types (i.e. not java.lang.Object or null) that do not match instruction parameters, method signatures or return types (e.g. assume that class Dog is a subclass of class Mammal, then saving an instance of Dog into a field of type Mammal in some class X would require loading class Dog and all it's superclasses to confirm it is indeed a subclass or Mammal). The other location for mismatch checking is at bytecode execution merge points where the stack or local variable entries contain different class types. The verifier merges these types to a common superclass type by loading each referenced class and all it's subclasses to determine the common type to propagate in the stack and local variable state. These additional class loads negatively impacts start-up performance of Java applications, increasing their memory footprint and causing extra file I/O access.
Some current solutions focus on patterns in the source code rather than bytecode. This approach changes the programmer's code, which can be visually unappealing. In general, this approach does not promote writing clean code and often breaks coding standards.
Therefore, there exists a need for deferring verification that focuses on bytecode rather than source code.